﻿using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.Linq;
using System.Text;
using System.Web;

namespace m.toidihoilo
{
    public class CaptchaHandler : IHttpHandler, System.Web.SessionState.IRequiresSessionState
    {

        public void ProcessRequest(HttpContext context)
        {
            string[] fonts = { "Arial Black", "Tahoma", "Sans-Serif" };

            const byte LENGTH = 4;

            // chuỗi để lấy các kí tự sẽ sử dụng cho captcha
            const string chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
            using (Bitmap bmp = new Bitmap(130, 50))
            {

                using (Graphics g = Graphics.FromImage(bmp))
                {
                    // Tạo nền cho ảnh dạng sóng
                    //HatchBrush brush = new HatchBrush(HatchStyle.Wave, Color.White, Color.Wheat);

                    //g.FillRegion(brush, g.Clip);
                    g.SmoothingMode = SmoothingMode.AntiAlias;
                    //Color bc = Color.FromArgb(124, 176, 65);            
                    Color bc = Color.White;
                    using (SolidBrush b = new SolidBrush(bc))
                    {
                        g.FillRegion(b, g.Clip);
                    }

                    // Lưu chuỗi captcha trong quá trình tạo
                    StringBuilder strCaptcha = new StringBuilder();

                    Random rand = new Random();

                    for (int i = 0; i < LENGTH; i++)
                    {
                        // Lấy kí tự ngẫu nhiên từ mảng chars
                        string str = chars[rand.Next(chars.Length)].ToString();
                        strCaptcha.Append(str);

                        // Tạo font với tên font ngẫu nhiên chọn từ mảng fonts
                        Font font = new Font(fonts[rand.Next(fonts.Length)], 18);

                        // Lấy kích thước của kí tự
                        SizeF size = g.MeasureString(str, font);
                        Color color = Color.FromArgb(129, 63, 65);
                        // Vẽ kí tự đó ra ảnh tại vị trí tăng dần theo i, vị trí top ngẫu nhiên                        
                        g.DrawString(str, font,
                                     new SolidBrush(color), i * 20, rand.Next(2, 10));
                        font.Dispose();
                    }

                    // Lưu captcha vào session
                    context.Session["captcha"] = strCaptcha.ToString();

                    // Ghi ảnh trực tiếp ra luồng xuất theo định dạng gif
                    context.Response.ContentType = "image/GIF";
                    bmp.Save(context.Response.OutputStream, ImageFormat.Gif);
                }
            }
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}